﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Reflection;
using System.Text;
using Lehnet.Models.DTO;

namespace Lehnet.BusinessLayer
{
    internal class DTOFacade
    {
        public static T BindDTO<T>(SqlDataReader dr)
        {
            if (dr.IsClosed)
            {
                throw new Exception("DataReader kapalı. Lütfen yazılımcınızla irtibata geçiniz.");
            }

            var dto = Activator.CreateInstance<T>();
            if (dto == null)
                throw new Exception("DTOEntity instance'ı alınamadı. BaseDTO'dan türetilmemiş. Lütfen yazılımcınızla irtibata geçiniz.");

            foreach (PropertyInfo pi in dto.GetType().GetProperties())
            {
                //set edilmemesi gereken veri tipleri
                if (pi.PropertyType.IsGenericType || pi.PropertyType == typeof(DataSet))
                    continue;

                if (pi.PropertyType.BaseType == typeof(BaseDTO))
                {
                    var property = BindDTO<BaseDTO>(dr);
                    pi.SetValue(dto, property, null);
                    continue;
                }
                if (dr[pi.Name] == DBNull.Value)
                    continue;

                pi.SetValue(dto, dr[pi.Name], null);
            }

            return dto;
        }
    }
}
